Extension 等價於 Objective-C 的 Category
Category 只能作用於 Class , Extension 則是所有看得到的型別皆可擴充。
Extension 的語法,較 Objective-C 更為簡單易寫。
據我認知 Category 應該是在OC .h裡面
宣告void 然後給其他class呼叫使用
範例如下
@interface NSObject(MySuperObject)
-(void) testA;
+(void) testB;
@end
// implementation
@implementation NSObject(MySuperObject)
-(void) testA
{
NSLog(@"Hello everybody!A!!");
}
+(void) testB
{
NSLog(@"Hello everybody!B!!");
}
以下是其他class 呼叫其Category
// 建立Book物件
Test *test = [[Test alloc] init];
// instance method from category
[test testA];
以下是宣告範例
extension Double {
var km: Double { return self * 1000 }
var m: Double { return self }
var cm: Double { return self / 100 }
}
直接使用如下
這邏輯也太奇怪了
print(25.2345.km)
print(25.2345.m)
print(25.2345.cm)
這樣可以直接丟值給Double
這感覺東西都差不多
感覺也跟Class差不多
那來研究一下Class
間單宣告如下
class DataImporter {
var fileName = "Steven"
}
宣告完以後就可以宣告一個空間
然後修改fileName
使用範例如下
let dataImporter = DataImporter()
print(dataImporter.fileName) //test
dataImporter.fileName = "test2" //修改Class裡面的值
print(dataImporter.fileName) //test2
介紹應該是使用網路上範例來解釋
宣告部份如下
class GameCharacter {
var hpValue: Double = 100
var defenceValue: Double = 300
var totalDefence: Double {
get { //沒傳值 直接print 就是get
return (defenceValue + 0.1 * hpValue)
}
set(levelUp) {//有傳值 傳入levelUp
hpValue = hpValue * (1 + levelUp)
defenceValue = defenceValue * (1 + levelUp)
}
}
}
呼叫部分如下
let oneChar = GameCharacter() //宣告空間
print(oneChar.totalDefence) //get
oneChar.totalDefence = 0.05 //set
使用方法簡單來說
get 就是單存你沒做修改
直接print 或是使用
就會去get的判斷式
如果有修改的話
就會前進至set判斷式
不會進get
這解釋應該很好懂
我自己的理解應該是這樣
上次除法做完了
但有BUG
當我使用 數字/0 以後
就會出現 inf
然後造成崩潰
所以除法應該要使用isInfinite的判斷
來避免
priceA = (priceB / priceA)
if priceA.isInfinite {
priceA = 0
}
商品部分兩條有點麻煩
我就改為一條
因為之後可能button需要用程式下去新增
使用會比較活
而且使用者可以自己客製化
金魚也學得會的「KD指標」! 什麼是KD黃金交叉、KD死亡交叉 - 2021年